package a

import (
	"math"
	"math/big"
	"strconv"

	"github.com/shopspring/decimal"
)

func A予大值[T int | decimal.Decimal](a, b T) T {
	switch v := any(a).(type) {
	case int:
		if v > any(b).(int) {
			return a
		}
	case decimal.Decimal:
		if v.GreaterThan(any(b).(decimal.Decimal)) {
			return a
		}
	}
	return b
}

func A圆整成字符串(num any, 位数 int) (res string) {
	if num == nil {
		return ""
	}
	var fnum float64
	switch v := num.(type) {
	case float64:
		fnum = v
	case *float64:
		// 解引用
		fnum = *v
	default:
		// 如果传入了其他不支持的类型，可以返回空字符串或 panic
		// panic(fmt.Sprintf("不支持的类型: %T", num))
		return ""
	}
	res = strconv.FormatFloat(fnum, 'f', 位数, 64)
	return
}

func A圆整(num float64, 位数 int) float64 {
	multiplier := math.Pow10(位数)
	return math.Round(num*multiplier) / multiplier
}

// Growth 计算增长率，参数为字符串类型以支持高精度输入
// 返回值为字符串类型，保留2位小数
func Growth(nowValue, lastValue any) string {
	// 解析输入为大浮点数
	now := new(big.Float)
	last := new(big.Float)
	now.SetString(A转string(nowValue))
	last.SetString(A转string(lastValue))

	// 定义常量
	zero := big.NewFloat(0)
	hundred := big.NewFloat(100)

	// 比较 lastValue 和 nowValue 是否都为 0
	lastIsZero := last.Cmp(zero) == 0
	nowIsZero := now.Cmp(zero) == 0

	if lastIsZero && nowIsZero {
		return "0.00"
	}

	if lastIsZero {
		// 当 lastValue 为 0 时，返回 nowValue * 100（保留2位小数）
		result := new(big.Float).Mul(now, hundred)
		return A转指定位数字符串(result, 2)
	}

	if nowIsZero {
		// 当 nowValue 为 0 时，计算 (0 - lastValue)/lastValue * 100
		sub := new(big.Float).Sub(zero, last)      // 0 - lastValue
		div := new(big.Float).Quo(sub, last)       // 除以 lastValue（保留4位小数精度）
		result := new(big.Float).Mul(div, hundred) // 乘以 100
		return A转指定位数字符串(result, 2)
	}

	// 常规情况：(nowValue - lastValue)/lastValue * 100
	sub := new(big.Float).Sub(now, last)       // 差值
	div := new(big.Float).Quo(sub, last)       // 除以 lastValue（保留4位小数精度）
	result := new(big.Float).Mul(div, hundred) // 乘以 100
	return A转指定位数字符串(result, 2)
}

// A转指定位数字符串 将 big.Float 格式化保留指定小数位数

// func main() {
// 	fmt.Println(Growth("50", "100"))  // 输出: -50.00
// 	fmt.Println(Growth("0", "100"))   // 输出: -100.00
// 	fmt.Println(Growth("100", "0"))   // 输出: 10000.00
// 	fmt.Println(Growth("0", "0"))     // 输出: 0.00
// 	fmt.Println(Growth("150", "100")) // 输出: 50.00
// 	fmt.Println(Growth("250", "200")) // 输出: 25.00
// }
